home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / Interfaces&Libraries / OpenTransport / Interfaces / CIncludes / mistream.h < prev    next >
Encoding:
C/C++ Source or Header  |  1996-11-21  |  15.5 KB  |  476 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        mistream.h
  3.  
  4.     Copyright:    © 1993-1996 by Mentat Inc., all rights reserved.
  5.  
  6. */
  7.  
  8. #ifndef __MISTREAM__
  9. #define __MISTREAM__
  10.  
  11. #if PRAGMA_ALIGN_SUPPORTED
  12. #pragma options align=mac68k
  13. #endif
  14.  
  15. #if OTKERNEL
  16.  
  17. /* defines module or driver */
  18. struct streamtab 
  19. {
  20.     struct qinit*    st_rdinit;        /* defines read QUEUE */
  21.     struct qinit*    st_wrinit;        /* defines write QUEUE */
  22.     struct qinit*    st_muxrinit;    /* for multiplexing drivers only */
  23.     struct qinit*    st_muxwinit;    /* ditto */
  24. };
  25.  
  26. typedef struct queue 
  27. {
  28.     struct qinit*    q_qinfo;    /* procedures and limits for queue */
  29.     struct msgb*     q_first;    /* head of message queue */
  30.     struct msgb*     q_last;        /* tail of message queue */
  31.     struct queue*    q_next;        /* next queue in Stream */
  32.     union 
  33.     {
  34.         struct queue*    q_u_link;     /* link to scheduling queue */
  35.         struct sqh_s*    q_u_sqh_parent;
  36.     } q_u;
  37.     char*            q_ptr;        /* to private data structure */
  38.     unsigned long    q_count;    /* weighted count of characters on q */
  39.     long            q_minpsz;    /* min packet size accepted */
  40.     long            q_maxpsz;    /* max packet size accepted */
  41.     unsigned long    q_hiwat;    /* high water mark, for flow control */
  42.     unsigned long    q_lowat;    /* low water mark */
  43.     struct qband*    q_bandp;    /* band information */
  44.     unsigned short    q_flag;     /* %%% queue state */
  45.     unsigned char    q_nband;    /* %%% number of bands */
  46.     unsigned char    q_pad1[1];    /* %%% reserved */
  47.     struct q_xtra*    q_osx;        /* Pointer to OS-dependent extra stuff */
  48.     struct queue*    q_ffcp;        /* Forward flow control pointer */
  49.     struct queue*    q_bfcp;        /* Backward flow control pointer */
  50. } queue_t;
  51.  
  52. #define q_link            q_u.q_u_link
  53. #define q_sqh_parent    q_u.q_u_sqh_parent
  54.  
  55. /* queue_t flag defines */
  56. #define QREADR                    0x1     /* This queue is a read queue */
  57. #define QNOENB                    0x2     /* Don't enable in putq */
  58. #define QFULL                    0x4     /* The queue is full */
  59. #define QWANTR                    0x8     /* The queue should be scheduled in the next putq */
  60. #define QWANTW                    0x10    /* The stream should be back enabled when this queue drains */
  61. #define QUSE                    0x20    /* The queue is allocated and ready for use */
  62. #define QENAB                    0x40    /* The queue is scheduled (on the run queue) */
  63. #define QBACK                    0x80    /* The queue has been back enabled */
  64. #define QOLD                    0x100    /* Module supports old style opens and closes */
  65. #define QHLIST                    0x200    /* The Stream head is doing something with this queue (Not supported by MPS) */
  66. #define QWELDED                 0x400    /* Mentat flag for welded queues */
  67. #define    QUNWELDING                0x800    /* Queue is scheduled to be unwelded */
  68. #define    QPROTECTED                0x1000    /* Mentat flag for unsafe q access */
  69.  
  70. typedef struct qband 
  71. {
  72.     struct qband*    qb_next;    /* next band for this queue */
  73.     unsigned long    qb_count;    /* weighted count of characters in this band */ 
  74.     struct msgb*     qb_first;     /* head of message queue */
  75.     struct msgb*     qb_last;    /* tail of message queue */
  76.     unsigned long    qb_hiwat;    /* high water mark */
  77.     unsigned long    qb_lowat;    /* low water mark */
  78.     unsigned short    qb_flag;    /* %%% state */
  79.     short            qb_pad1;    /* %%% reserved */
  80. } qband_t;
  81.  
  82. /* qband_t flag defines */
  83. #define QB_FULL         0x1             /* The band is full */
  84. #define QB_WANTW        0x2             /* The stream should be back enabled when this band/queue drains */
  85. #define QB_BACK         0x4             /* The queue has been back enabled */
  86.  
  87. #ifdef __cplusplus
  88. extern "C" {
  89. #endif
  90.  
  91. typedef    int    (* putp_t)(queue_t *, struct msgb *);
  92. typedef    int    (* srvp_t)(queue_t *);
  93. typedef int (* admin_t)(void);
  94. typedef void (* bufcall_t)(long);
  95. typedef int    (* openp_t)(queue_t*, dev_t*, int, int, cred_t*);
  96. typedef int (* closep_t)(queue_t*, int, cred_t*);
  97. typedef int    (* openOld_t)(queue_t*, dev_t, int, int);
  98. typedef int (* closeOld_t)(queue_t*);
  99.  
  100. #ifdef __cplusplus
  101. }
  102. #endif
  103.  
  104. struct qinit 
  105. {
  106.     putp_t        qi_putp;                /* put procedure */
  107.     srvp_t        qi_srvp;                /* service procedure */
  108.     openp_t        qi_qopen;                /* called on each open or a push */
  109.     closep_t    qi_qclose;                 /* called on last close or a pop */
  110.     admin_t        qi_qadmin;                 /* reserved for future use */
  111.     struct module_info* qi_minfo;        /* information structure */
  112.     struct module_stat* qi_mstat;        /* statistics structure - optional */
  113. };
  114.  
  115. #if PRAGMA_ALIGN_SUPPORTED
  116.     #if GENERATINGPOWERPC
  117.     #pragma options align=power
  118.     #endif
  119.     #if GENERATING68K
  120.     #pragma options align=mac68k
  121.     #endif
  122. #endif
  123.  
  124. struct module_info 
  125. {
  126.     unsigned short    mi_idnum;        /* module ID number */
  127.     char*            mi_idname;        /* module name */
  128.     long            mi_minpsz;        /* min pkt size, for developer use */
  129.     long            mi_maxpsz;        /* max pkt size, for developer use */
  130.     unsigned long    mi_hiwat;        /* hi-water mark, for flow control */
  131.     unsigned long    mi_lowat;        /* lo-water mark, for flow control */
  132. };
  133.  
  134. #if PRAGMA_ALIGN_SUPPORTED
  135.     #pragma options align=reset
  136. #endif
  137.  
  138. #else
  139.  
  140. typedef int    queue_t;
  141.  
  142. #endif    /* OTKERNEL */
  143.  
  144. /* message block */
  145.  
  146. typedef struct msgb 
  147. {
  148.     struct msgb*     b_next;        /* next message on queue */
  149.     struct msgb*     b_prev;        /* previous message on queue */
  150.     struct msgb*     b_cont;        /* next message block of message */
  151.     unsigned char*    b_rptr;        /* first unread data byte in buffer */
  152.     unsigned char*    b_wptr;        /* first unwritten data byte */
  153.     struct datab*    b_datap;    /* data block */
  154.     unsigned char    b_band;     /* message priority */
  155.     unsigned char    b_pad1;
  156.     unsigned short    b_flag;
  157. #ifdef    MSGB_XTRA
  158.     MSGB_XTRA
  159. #endif
  160. } mblk_t;
  161.  
  162. /* mblk flags */
  163. #define MSGMARK         0x01            /* last byte of message is tagged */
  164. #define MSGNOLOOP        0x02            /* don't pass message to write-side of stream */
  165. #define MSGDELIM        0x04            /* message is delimited */
  166. #define MSGNOGET        0x08
  167.  
  168. /* data descriptor */
  169.  
  170. typedef struct datab 
  171. {
  172.     union 
  173.     {
  174.         struct datab*    freep;
  175.         struct free_rtn* frtnp;
  176.     } db_f;
  177.     unsigned char*    db_base;        /* first byte of buffer */
  178.     unsigned char*    db_lim;            /* last byte+1 of buffer */
  179.     unsigned char    db_ref;         /* count of messages pointing to block*/
  180.     unsigned char    db_type;        /* message type */
  181.     unsigned char    db_iswhat;        /* message status */
  182.     unsigned char    db_filler2;        /* for spacing */
  183.     unsigned int    db_size;        /* used internally */
  184.     unsigned char*    db_msgaddr;     /* used internally */
  185.     long            db_filler;
  186. } dblk_t;
  187. #define db_freep        db_f.freep
  188. #define db_frtnp        db_f.frtnp
  189.  
  190. /* Free return structure for esballoc */
  191.  
  192. #ifdef __cplusplus
  193. extern "C" {
  194. #endif
  195.  
  196. typedef struct free_rtn 
  197. {
  198.     void    (*free_func)(char* arg);     /* Routine to call to free buffer */
  199.     char*    free_arg;                             /* Parameter to free_func */
  200. } frtn_t;
  201.  
  202. #ifdef __cplusplus
  203. }
  204. #endif
  205.  
  206. /* Message types */
  207. #define QNORM            0
  208. #define M_DATA            0                /* Ordinary data */
  209. #define M_PROTO         1                /* Internal control info and data */
  210. #define M_BREAK         010             /* Request a driver to send a break */
  211. #define M_PASSFP        011             /* Used to pass a file pointer */
  212. #define M_SIG            013             /* Requests a signal to be sent */
  213. #define M_DELAY         014             /* Request a real-time delay */
  214. #define M_CTL            015             /* For inter-module communication */
  215. #define M_IOCTL         016             /* Used internally for I_STR requests */
  216. #define M_SETOPTS        020             /* Alters characteristics of Stream head */
  217. #define M_RSE            021             /* Reserved for internal use */
  218.  
  219. /* MPS private type */
  220. #define M_MI            0100
  221. #define M_MI_READ_RESET    1
  222. #define M_MI_READ_SEEK       2
  223. #define M_MI_READ_END       4
  224.  
  225. /* Priority messages types */
  226. #define QPCTL            0200
  227. #define M_IOCACK        0201            /* Positive ack of previous M_IOCTL */
  228. #define M_IOCNAK        0202            /* Previous M_IOCTL failed */
  229. #define M_PCPROTO        0203            /* Same as M_PROTO except for priority */
  230. #define M_PCSIG         0204            /* Priority signal */
  231. #define M_FLUSH         0206            /* Requests modules to flush queues */
  232. #define M_STOP            0207            /* Request drivers to stop output */
  233. #define M_START         0210            /* Request drivers to start output */
  234. #define M_HANGUP        0211            /* Driver can no longer produce data */
  235. #define M_ERROR         0212            /* Reports downstream error condition */
  236. #define M_READ            0213            /* Reports client read at Stream head */
  237. #define M_COPYIN        0214            /* Requests the Stream to copy data in for a module */
  238. #define M_COPYOUT        0215            /* Requests the Stream to copy data out for a module */
  239. #define M_IOCDATA        0216            /* Status from M_COPYIN/M_COPYOUT message */
  240. #define M_PCRSE         0220            /* Reserved for internal use */
  241. #define M_STOPI         0221            /* Request drivers to stop input */
  242. #define M_STARTI        0222            /* Request drivers to start input */
  243. #define M_HPDATA        0223            /* MPS-private type; high priority data */
  244.  
  245. /* Defines for flush messages */
  246. #define FLUSHALL        1
  247. #define FLUSHDATA        0
  248.  
  249. #define NOERROR         -1                /* used in M_ERROR messages */
  250.  
  251. /* structure contained in M_COPYIN/M_COPYOUT messages */
  252. struct copyreq 
  253. {
  254.     int             cq_cmd;         /* ioctl command (from ioc_cmd) */
  255.     struct cred*    cq_cr;            /* pointer to full credentials */
  256.     unsigned int    cq_id;            /* ioctl id (from ioc_id) */
  257.     unsigned char*    cq_addr;        /* address to copy data to/from */
  258.     unsigned int    cq_size;        /* number of bytes to copy */
  259.     int             cq_flag;        /* state */
  260.     mblk_t*            cq_private;        /* private state information */
  261.     long            cq_filler[4];
  262. };
  263. #define cq_uid    cq_cr->cr_uid
  264. #define cq_gid    cq_cr->cr_gid
  265.  
  266. /* copyreq defines */
  267. #define STRCANON        0x1             /* b_cont data block contains canonical format specifier */
  268. #define RECOPY            0x2             /* perform I_STR copyin again this time using canonical format specifier */
  269.  
  270. /* structure contained in M_IOCDATA message block */
  271. struct copyresp 
  272. {
  273.     int             cp_cmd;         /* ioctl command (from ioc_cmd) */
  274.     struct cred*    cp_cr;            /* pointer to full credentials */
  275.     unsigned int    cp_id;            /* ioctl id (from ioc_id) */
  276.     unsigned char*    cp_rval;        /* status of request; 0 for success; error value for failure */
  277.     unsigned int    cp_pad1;
  278.     int             cp_pad2;
  279.     mblk_t*            cp_private;        /* private state information */
  280.     long            cp_filler[4];
  281. };
  282. #define cp_uid    cp_cr->cr_uid
  283. #define cp_gid    cp_cr->cr_gid
  284.  
  285. /* structure contained in an M_IOCTL message block */
  286. struct iocblk 
  287. {
  288.     int             ioc_cmd;        /* ioctl command type */
  289.     struct cred*    ioc_cr;            /* pointer to full credentials */
  290.     unsigned int    ioc_id;         /* ioctl id */
  291.     unsigned int    ioc_count;        /* count of bytes in data field */
  292.     int             ioc_error;        /* error code */
  293.     int             ioc_rval;        /* return value */
  294.     long            ioc_filler[4];
  295. };
  296. #define ioc_uid ioc_cr->cr_uid
  297. #define ioc_gid ioc_cr->cr_gid
  298.  
  299. #define TRANSPARENT             ((unsigned int)-1)        /* ioc_count value for transparent ioctl's */
  300.  
  301. /* Used in M_IOCTL mblks to muxes (ioc_cmd I_LINK) */
  302. struct linkblk 
  303. {
  304.     struct queue* l_qtop;        /* lowest level write queue of upper stream */
  305.     struct queue* l_qbot;        /* highest level write queue of lower stream */
  306.     int     l_index;        /* system-unique index for lower stream */
  307.     long        l_pad[5];
  308. };
  309.  
  310. /* structure contained in an M_PASSFP message block */
  311. struct strpfp 
  312. {
  313.     unsigned long    pass_file_cookie;        /* file 'pointer' */
  314.     unsigned short    pass_uid;                /* user id of sending stream */
  315.     unsigned short    pass_gid;
  316.     struct sth_s*    pass_sth;             /* Stream head pointer of passed stream */
  317. };
  318.  
  319. /* structure contained in an M_SETOPTS message block */
  320. struct stroptions 
  321. {
  322.     unsigned long so_flags; /* options to set */
  323.     short            so_readopt;     /* read option */
  324.     unsigned short    so_wroff;        /* write offset */
  325.     long            so_minpsz;        /* minimum read packet size */
  326.     long            so_maxpsz;        /* maximum read packet size */
  327.     unsigned long    so_hiwat;        /* read queue high-water mark */
  328.     unsigned long    so_lowat;        /* read queue low-water mark */
  329.     unsigned char    so_band;         /* band for water marks */
  330.     unsigned char    so_filler[3];    /* added for alignment */
  331.     unsigned long    so_poll_set;    /* poll events to set */
  332.     unsigned long    so_poll_clr;    /* poll events to clear */
  333. };
  334. /* definitions for so_flags field */
  335. #define SO_ALL            0x7fff    /* Update all options */
  336. #define SO_READOPT        0x0001    /* Set the read mode */
  337. #define SO_WROFF        0x0002    /* Insert an offset in write M_DATA mblks */
  338. #define SO_MINPSZ        0x0004    /* Change the min packet size on sth rq */
  339. #define SO_MAXPSZ        0x0008    /* Change the max packet size on sth rq */
  340. #define SO_HIWAT        0x0010    /* Change the high water mark on sth rq */
  341. #define SO_LOWAT        0x0020    /* Change the low water mark */
  342. #define SO_MREADON        0x0040    /* Request M_READ messages */
  343. #define SO_MREADOFF     0x0080    /* Don't gen M_READ messages */
  344. #define SO_NDELON        0x0100    /* old TTY semantics for O_NDELAY reads and writes */
  345. #define SO_NDELOFF        0x0200    /* STREAMS semantics for O_NDELAY reads and writes */
  346. #define SO_ISTTY        0x0400    /* Become a controlling tty */
  347. #define SO_ISNTTY        0x0800    /* No longer a controlling tty */
  348. #define SO_TOSTOP        0x1000    /* Stop on background writes */
  349. #define SO_TONSTOP        0x2000    /* Don't stop on background writes */
  350. #define SO_BAND         0x4000    /* Water marks are for a band */
  351. #define SO_POLL_SET        0x8000    /* Set events to poll */
  352. #define SO_POLL_CLR        0x10000    /* Clear events to poll */
  353.  
  354. /* Buffer Allocation Priority */
  355. #define BPRI_LO         1
  356. #define BPRI_MED        2
  357. #define BPRI_HI         3
  358.  
  359. #ifndef INFPSZ
  360. #define INFPSZ            -1
  361. #endif
  362.  
  363. /** Test whether message is a data message */
  364. #define datamsg(type)    ((type) == M_DATA || (type) == M_PROTO || (type) == M_PCPROTO  ||  (type) == M_DELAY)
  365.  
  366. #if OTKERNEL
  367.  
  368. /** Re-allow a queue to be scheduled for service */
  369. #define enableok(q)     ((q)->q_flag &= ~QNOENB)
  370.  
  371. /** Prevent a queue from being scheduled */
  372. #define noenable(q)     ((q)->q_flag |= QNOENB)
  373.  
  374. /** Get pointer to the mate queue */
  375. #define OTHERQ(q)        (((q)->q_flag & QREADR) ? WR(q) : RD(q))
  376.  
  377. /** Get pointer to the read queue, assumes 'q' is a write queue ptr */
  378. #define RD(q)    (&q[-1])
  379.  
  380. /** Get pointer to the write queue, assumes 'q' is a read queue ptr */
  381. #define WR(q)    (&q[1])
  382.  
  383. #endif    /* OTKERNEL */
  384.  
  385. #define CLONEOPEN        0x2
  386. #define MODOPEN         0x1
  387. #define OPENFAIL        -1
  388.  
  389. /* Enumeration values for strqget and strqset */
  390. typedef enum qfields {
  391.     QHIWAT    = 0,
  392.     QLOWAT    = 1,
  393.     QMAXPSZ    = 2,
  394.     QMINPSZ    = 3,
  395.     QCOUNT    = 4,
  396.     QFIRST    = 5,
  397.     QLAST    = 6,
  398.     QFLAG    = 7,
  399.     QBAD    = 8
  400. } qfields_t;
  401.  
  402. #ifdef __cplusplus
  403. extern "C" {
  404. #endif
  405.  
  406. #if OTKERNEL
  407.  
  408. extern mblk_t*    allocb(size_t size, int pri);
  409. extern queue_t*    allocq(void);
  410. extern int        adjmsg(mblk_t*, int len_param);
  411. extern queue_t*    backq(queue_t*);
  412.  
  413. extern int        bcanput(queue_t*, uchar_p pri);
  414. extern int        bcanputnext(queue_t*, uchar_p pri);
  415. extern int        bufcall(size_t memNeeded, int pri, bufcall_t,
  416.                         long context);
  417. extern int        canput(queue_t*);
  418. extern int        canputnext(queue_t*);
  419. extern mblk_t*    copyb(mblk_t*);
  420. extern mblk_t*    copymsg(mblk_t*);
  421. extern mblk_t*    dupb(mblk_t*);
  422. extern mblk_t*    dupmsg(mblk_t*);
  423. extern mblk_t*    esballoc(unsigned char* base, size_t size, int pri, frtn_t*);
  424. extern void        flushband(queue_t*, uchar_p pri, int flag);
  425. extern void        flushq(queue_t*, int flag);
  426. extern void        freeb(mblk_t*);
  427. extern void        freemsg(mblk_t*);
  428. extern int        freeq(queue_t*);
  429. extern int        freezestr(queue_t*);
  430. extern admin_t    getadmin(ushort_p mid);
  431. extern unsigned short    getmid(char * name);
  432. extern mblk_t*    getq(queue_t*);
  433. extern int        insq(queue_t*, mblk_t* emp, mblk_t* nmp);
  434. extern void        linkb(mblk_t* mp1, mblk_t* mp2);
  435. extern int        msgdsize(const mblk_t*);
  436. extern mblk_t*    msgpullup(mblk_t*, int len);
  437. extern int        pullupmsg(mblk_t*, int len);
  438. extern int        putbq(queue_t*, mblk_t*);
  439. extern int        putctl(queue_t*, int type);
  440. extern int        putnextctl(queue_t*, int type);
  441. extern int        putctl1(queue_t*, int type, int c);
  442. extern int        putnextctl1(queue_t*, int type, int c);
  443. extern int        putctl2(queue_t*, int type, int c1, int c2);
  444. #ifndef puthere
  445. extern int        puthere(queue_t*, mblk_t*);
  446. #endif
  447. extern int        putnext(queue_t*,  mblk_t*);
  448. extern int        putq(queue_t*, mblk_t*);
  449. extern void        qenable(queue_t*);
  450. extern void        qprocson(queue_t*);
  451. extern void        qprocsoff(queue_t*);
  452. extern int        qreply(queue_t*, mblk_t*);
  453. extern int        qsize(queue_t*);
  454. extern mblk_t*    rmvb(mblk_t * mp, mblk_t * bp);
  455. extern void        rmvq(queue_t*, mblk_t*);
  456. /* prototype for strlog in strlog.h */
  457. extern int        strqget(queue_t*, qfields_t what, uchar_p pri, long* valp);
  458. extern int        strqset(queue_t*, qfields_t what, uchar_p pri, long val);
  459. extern int        testb(int size, int pri);
  460. extern void        unbufcall(int id);
  461. extern void        unfreezestr(queue_t * q, int oldpri);
  462. extern mblk_t*    unlinkb(mblk_t*);
  463.  
  464. #endif    /* OTKERNEL */
  465.  
  466. #ifdef __cplusplus
  467. }
  468. #endif
  469.  
  470. #if PRAGMA_ALIGN_SUPPORTED
  471. #pragma options align=reset
  472. #endif
  473.  
  474.  
  475. #endif    /* ifdef _MPS_STREAM_    */
  476.